这个问题在这里已经有了答案:Howtocheckifenumvalueisvalid?(11个答案)关闭6年前。或者另一种表达方式是:编译器是否可以假设enum的实例只能保存它被声明为保存的值并根据该假设进行优化?enumMyType{A=1,B=2};constMyTypeC=static_cast(3);voidfun(MyTypem){switch(m){caseA://...break;caseB://...break;caseC://canthisbeoptimizedaway?}}
我可以定义一个类型作为枚举的基础类型吗?像这样:structS{S(inti):value(i){}operatorint(){returnvalue;}intvalue;};enumE:S{A,B,C};错误信息告诉我S必须是整数类型。我尝试像下面这样专门化std::is_integral,但似乎在这种情况下,“整数类型”确实意味着基本类型之一。namespacestd{templatestructis_integral:publictrue_type{};}那么,使用任何版本的C++,是否有办法使自定义类型作为整数类型假冒? 最佳答案
我在C++11标准中没有发现任何表示不推荐使用无范围枚举的措辞,但从实用的角度来看,我想知道它们是否仍然有用。我团队中的很多人都养成了将无作用域枚举转换为有作用域枚举的习惯,但这引起了一些头痛:classfoo{public:enumMyEnum{One,Two,Three};};他们将其转换为:classfoo{public:enumclassMyEnum{One,Two,Three};};这意味着当使用这些枚举器时,它看起来像foo::MyEnum::One而不是foo::One。我一直在询问以下最佳实践:如果您转换为作用域枚举,请将其移出类并移至全局作用域或命名空间作用域(以提高
我想知道是否有任何巧妙的技巧可以安全地将整数转换为枚举。在您投票认为这是重复之前,我不是在问如何转换(inti;Enume=static_cast(i)很简单)。我问的是如何安全地执行此操作,验证结果值确实在枚举中。代码如下enumclassE{A=1,B=2};intmain(int,char**){inti=3;Ee=static_cast(i);}将编译(AFAIK)但是e将不包含枚举中的有效值。我想到的最好的方法是类似switch(i){case1:returnE::A;case2:returnE::B;default:throwinvalid_argument("");}哪个
我已经在库中运行了这段代码很长一段时间:MyClass::MyClass():QDialog(){//(...)setWindowFlags(Qt::CustomizeWindowHint|Qt::WindowTitleHint);//(...)}然后,在更改了库的各个部分之后,我突然收到了这条消息:errorC2664:'QWidget::setWindowFlags':cannotconvertparameter1from'int'to'Qt::WindowFlags'显然它没有找到|QFlags类提供的运算符重载,以便|的结果返回一个int而不是QFlags结构。我知道我可以手动
给定一个函数,例如:templatevoidfunction1(constT&t){function2(boost::lexical_cast(t));}如果传递给function1的类型已经是std::string,会产生什么样的开销?开销是否会根据我要lexical_cast-ing的类型而有所不同?做一个重载函数来绕过强制转换是多余的吗?例如:voidfunction1(conststd::string&t){function2(t);}templatevoidfunction1(constT&t){function1(boost::lexical_cast(t));}boost
您好,我有以下代码:enum{a,b,c,d,...,z}abc;intmain(){intval=20;if(val==a||val==b||val==c||val==d.....||val==z){/*Dosomething*/}}有没有其他方法可以跳过OR操作,因为如果有1000个枚举成员,那么我们如何提前检查所有成员。请帮忙。 最佳答案 现代编译器应该能够优化这样的代码,就像你的情况一样,表达式的值在编译时是已知的。对于可读性和错误检查,我认为使用switch会更好:switch(val){casea:;caseb:;...
这就是我想要做的:enumMyEnum{ONE=1,TWO,THREE};templatevoidfunc(){cout();};它有效,但我收到警告:“警告C4482:使用了非标准扩展:限定名称中使用了枚举‘MyEnum’”如何在没有收到警告的情况下执行此操作 最佳答案 枚举在这里有点棘手。类型ONE和TWO将位于外部命名空间中。因此,将类型添加到名称会导致警告。您可以删除限定符templatevoidfunc(){cout因为这两个在外部命名空间中是已知的。您也可以将您的枚举移动到某种封闭结构。structEnumContain
我正在调用一个外部提供的COMDLL,我已经为其生成了一个COM互操作包装器。为了便于争论,让我们调用我要调用的接口(interface)IEnumFoo。IEnumFoo具有典型的COM枚举器模式:HRESULTNext(ULONGcelt,IFoo**rgelt,ULONG*pceltFetched);其中第一个参数是期望结果的数量,第二个参数是写入结果的缓冲区,最后一个参数描述了实际写入的结果数量。当我选择“添加引用”并将VisualStudio指向此DLL时,它会生成一个具有以下签名的COM互操作程序集:voidNext(uint,outIFoo,outuint)这只允许.NE
C++11作用域枚举很棒,您应该尽可能使用它们。但是,有时您需要将整数转换为作用域枚举值(假设您是从用户输入中获取它)。是否有一种安全的方法来执行此操作并检测值何时无效(即超出枚举的允许值)?我相信如果整数无效,仅使用static_cast会导致未定义的行为。是否有一种通用的方法不需要手动为每个作用域枚举类型编写转换函数(并且每次向枚举添加新值时都需要更新)? 最佳答案 一个常见的方法是在你的枚举中包含一个结束标记enumclassColors:char{Red,Green,Blue,Last_Element}使用这种方法,在转换时